/*******************************************************************************
 *
 * File:        QUTIL.c
 * Progetto:    Robottino
 * Ambiente:    PIC32
 * Data:        26/03/2012
 * Autore:      M. Tili
 * Versione:    00.03
 *
 * Descrizione: 
 *   File contenente l'implementazione del modulo di utilita' per la gestione
 *   delle code.
 *
 *
 * Modifica:  09/05/2012  | M.Tili
 *                        | Rinominate le funzioni per differenziarle da quelle temporanee e che
 *                        | magari diventeranno quelle definitive.
 * Modifica:  14/05/2012  | M.Tili
 *                        | Rework del modulo.
 * Modifica:  15/05/2012  | M.Tili
 *                        | Aggiunta inclusione di GLOBVAR.h e inserite le
 *                        | chiamate alla set degli errori.
 *                        | Cambiato il nome del campo 'n' in 'maxSizeOfQ'.
 *
 */
 
#include "CONFIG.h"
#include "TYPEDEFS.h"
#include "GLOBVAR.h"
#include "QUTIL.h"



/*********************************************/



/*******************************************************************************
 *
 *  QInit
 *  Descrizione: Questa funzione inizializza i dati del modulo QUTIL.
 *    |  ptrQ           | riferimento alla coda                                |
 *    |  head           | indirizzo dell'array (risorse della coda)            |
 *    |  maxSizeOfQ     | dimensione massima della coda                        |
 *
 */
	BOOLEAN QInit(t_queue* ptrQ, void* head, unsigned short int maxSizeOfQ)
	{
	  BOOLEAN retValue;
	  retValue = FALSE;
	  if (head != NULL)
	  {
	    ptrQ->headQ    =  head;
	    ptrQ->idxFRONT =  0;
	    ptrQ->idxBACK  =  0;
	    ptrQ->size     =  0;
	    ptrQ->n        =  maxSizeOfQ;
	    retValue       =  TRUE;
	  }
	return retValue;
	}


	/*****************************************************************************
	 * NOTA !
	 * Inserzione/estrazione di un elemento com memcopy per essere generici.
	 *
	 *
	 * NOTA: per il campo elemSize, utilizzare sizeof(struct struct_type) dal 
	 * chiamante o anche sizeof(enum_type) 
	 ****************************************************************************/



/*******************************************************************************
 *
 *  QPut
 *  Descrizione: Questa funzione inserisce un dato nella coda.
 *    |  ptrQ           | riferimento alla coda                                |
 *    |  dataPtr        | indirizzo del dato da copiare/inserire in coda       |
 *    |  elemSize       | size dei dati da copiare/inserire in coda            |
 *
 */
	BOOLEAN QPut(t_queue* ptrQ, void * dataPtr, unsigned short int elemSize)
	{
	  BOOLEAN bRet;
	  void * tempPtr;
	  if (ptrQ->size < ptrQ->n)
	  {
	   /* non conosco il tipo di dato, quindi faccio il conto in
	      byte supponendo che la coda contenga tutti elementi dello
	      stesso tipo/dimensione 
	   */
	    tempPtr = ptrQ->headQ + (ptrQ->idxBACK * elemSize);
	    MEMCOPY(tempPtr,dataPtr,elemSize);
	    if (ptrQ->idxBACK = ptrQ->n)
	    {
	      ptrQ->idxBACK = 0;
	    }
	    ptrQ->size++;
	    bRet = TRUE;
	  }
	  else
	  {
	    /* CODA PIENA ! */
	    bRet = FALSE;
	  }
	  return bRet;
	}



/*******************************************************************************
 *
 *  QGet
 *  Descrizione: Questa funzione inserisce un dato nella coda.
 *    |  ptrQ           | riferimento alla coda                                |
 *    |  dataPtr        | indirizzo del dato in cui copiare quello estratto    |
 *    |                 | dalla coda                                           |
 *    |  elemSize       | size dei dati da copiare/estrarre dalla coda         |
 */
	void QGet(t_queue* ptrQ, void * dataPtr, , unsigned short int elemSize)
	{
	  void * tempPtr;
	  BOOLEAN bRet;
	  if (ptrQ->size >0)
	  {
	    tempPtr = ptrQ->headQ + (ptrQ->idxFRONT * elemSize);
	    MEMCOPY(dataPtr,tempPtr,elemSize);
	    ptrQ->idxFRONT++;
	    if (ptrQ->idxFRONT = ptrQ->n)
	    {
	      ptrQ->idxFRONT = 0;
	    }
	    ptrQ->size--;
	    bRet = TRUE;
	  }
	  else
	  {
	    /* CODA VUOTA ! */
	    bRet = FALSE;
	  }
	  return bRet;
	}



/*******************************************************************************
 *
 *  QIsEmpty
 *  Descrizione: Questa funzione restituisce TRUE se la coda e' vuota, FALSE se
 *               invece esiste almeno 1 elemento nella coda.
 *    |  ptrQ           | riferimento alla coda                                |
 */
	BOOLEAN QIsEmpty(t_queue* ptrQ)
	{
	  BOOLEAN bRet;
	  if (ptrQ->size > 0)
	  {
	    bRet = FALSE;
	  }
	  else
	  {
	    bRet = TRUE;
	  }
	  return bRet;
	}







